#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "msg_quene.h"

#define MSG_TYPE 1
#define CONTENT_SIZE (sizeof(msg_t) - sizeof(long int))

using namespace std;

msg_quene_t::msg_quene_t(int _cs)
{
    key_t key;
    //创建KEY值
    cs = _cs;

    if((key = ftok("/home/pi/code/raspHome", 'q')) < 0){
        perror("ftok error");
        exit(1);
    }
    if(cs == MSG_SERVER)
    {
        if((msg_id = msgget(key, IPC_CREAT|IPC_EXCL|0664)) < 0)
        {
            if(errno != EEXIST){
                perror("msg_server msgget");
            //    exit(1);
                return;
            }
            else{
                //如果消息队列已存在，打开消息队列
                msg_id = msgget(key, 0664);
            }
        }
    }
    else if(cs == MSG_CLIENT)
    {
        msg_id = msgget(key, 0664);
        if(msg_id < 0)
        {
            perror("msg client msgget");
        //    exit(1);
            return;
        }
    }
}
msg_quene_t::~msg_quene_t(void)
{
    int ret;
    if(cs == MSG_SERVER)
    {
        ret = msgctl(msg_id,IPC_RMID,NULL);
        
        if(ret < 0)
        {
            cout << "the msg quene is not exist,remove failure" << endl;
        }
    }
    else if(cs == MSG_CLIENT)
    {
    
    }
}

int msg_quene_t::send(struct msg_content_t &_msg_content)
{
    struct msg_t msg;
    if(msg_id < 0)
    {
        return msg_id;
    }
    msg.msg_type = MSG_TYPE;
    msg.content = _msg_content;

    if(msgsnd(msg_id, (void *)&msg, CONTENT_SIZE, 0) == -1)
    {
    //    perror("msgsnd");
        return -1;
    }
    return 0;
}
int msg_quene_t::receive(struct msg_content_t &_content)
{
    struct msg_t _msg;
    if(msg_id < 0)
    {
        return msg_id;
    }
    if(msgrcv(msg_id,(void *)&_msg,CONTENT_SIZE,MSG_TYPE,0) == -1)
    {
    //    perror("msgrcv");
        return -1;
    }
    _content = _msg.content;
    return 0;
}
